package io.a2a.client;

import io.a2a.spec.AgentCard;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * A2A客户端，用于与Agent进行通信
 * 基于Nacos 3.1官方文档实现
 */
public class A2AClient {
    
    private static final Logger logger = LoggerFactory.getLogger(A2AClient.class);
    
    private final AgentCard agentCard;
    
    /**
     * 构造函数
     * @param agentCard Agent卡片信息
     */
    public A2AClient(AgentCard agentCard) {
        this.agentCard = agentCard;
        logger.info("A2AClient initialized with agent: {}", agentCard.name());
    }
    
    /**
     * 调用Agent并获取响应
     * @param params 消息发送参数
     * @return Agent的响应
     */
    public String call(MessageSendParams params) {
        try {
            logger.info("Sending message to agent {}: {}", agentCard.name(), params.getMessage());
            
            // 模拟调用Agent的逻辑
            // 在实际实现中，这里会通过网络调用Agent服务
            String response = processMessage(params.getMessage());
            
            logger.info("Received response from agent {}: {}", agentCard.name(), response);
            return response;
            
        } catch (Exception e) {
            logger.error("Error calling agent {}: {}", agentCard.name(), e.getMessage(), e);
            throw new RuntimeException("Failed to call agent: " + e.getMessage(), e);
        }
    }
    
    /**
     * 获取Agent卡片信息
     * @return Agent卡片
     */
    public AgentCard getAgentCard() {
        return agentCard;
    }
    
    /**
     * 检查客户端是否可用
     * @return 是否可用
     */
    public boolean isAvailable() {
        return agentCard != null && agentCard.url() != null;
    }
    
    /**
     * 处理消息的内部方法
     * @param message 消息内容
     * @return 处理结果
     */
    private String processMessage(String message) {
        // 这里是模拟的处理逻辑
        // 实际实现中会根据Agent的URL和协议进行网络调用
        if (message == null || message.trim().isEmpty()) {
            return "Error: Empty message";
        }
        
        // 模拟Agent响应
        return String.format("Agent %s received message: %s. Response: Hello from %s!", 
                agentCard.name(), message, agentCard.name());
    }
}